# agents/interview_agent.py

from lagent.agents import Agent
from lagent.schema import AgentMessage
import requests
import json
import re

class InterviewAgent(Agent):
    def __init__(
            self,
            llm,
            aggregator
    ):
        super().__init__(llm=llm,aggregator=aggregator)
        self.resume = None
        self.introduction = None
        self.questions = []
        self.answers = []
        self.evaluations = []

        self.professional_question_count = 0  # 已提出的专业问题数量
        self.follow_up_count = 0  # 当前问题的追问次数
        self.non_professional_question_asked = False  # 是否已提出非专业问题
        self.current_question_type = 'professional'  # 当前问题类型
        # 评价模型
        self.url = "https://api.siliconflow.cn/v1/chat/completions"
        self.headers = {
            "Authorization": "Bearer sk-dgxjhtoohyyxvjzoouixerefxbwvwrtnenkejpkoxntxhiyg",
            "Content-Type": "application/json"
        }


    # 简历
    def set_resume(self, resume_text):
        self.resume = resume_text

    # 自我介绍
    def set_selfIntroduction(self, introduction_text):
        self.introduction = introduction_text

    # 面试开始前的开场白，用于打招呼
    def preInterview(self):
        prompt= "请根据简历中面试者的姓名，提取姓氏，并生成如下格式的开场白：Hi~{姓}同学，你好！请先做个自我介绍吧！"
        greet_msg = AgentMessage(sender='interviewer',content=prompt)
        greetings = super().__call__(greet_msg).content
        return greetings

    def generete_FistQuestion(self, introduction):
        prompt = "请根据面试者的简历、意向岗位和自我介绍，提出第一个问题，贴近真实面试情境，专业问题不要结合学生工作，不要结合大学期间担任的学生干部，不需要回答好的，只需输出问题。求职者的自我介绍如下：" + introduction
        question_msg = AgentMessage(sender='interviewer',content=prompt)
        question = super().__call__(question_msg).content.replace(" ","").replace("*","").replace("#","")
        self.questions.append(question)
        self.professional_question_count = 1
        self.follow_up_count = 0
        self.current_question_type = 'professional'
        return question

    def generate_normalQuestion(self,question,answer):
        self.answers.append(answer)
        eval_str = self.evaluate_answer(question,answer)
        if self.professional_question_count < 3:
            if '良' in eval_str or '差' in eval_str:
                if self.follow_up_count < 2:
                    self.follow_up_count += 1
                    prompt = f"面试者的回答一般，分析面试者回答的不足之处，针对之前的问题'{question}'继续追问相关内容，面试者的回答是：'{answer}'。请提出一个相关的追问，只需要输出问题，不需要回答好的等。专业问题不要结合学生工作。"
                else:
                    self.professional_question_count += 1
                    self.follow_up_count = 0
                    prompt = f"请根据简历和自我介绍，提出一个新的专业问题。请提出一个相关的追问，只需要输出问题，不需要回答好的等。专业问题不要结合学生工作。"
            elif '不' in eval_str:
                # self.professional_question_count += 1
                # self.follow_up_count += 1
                prompt = (f"面试者被问到：'{question}'，其回答是：'{answer}'。"
                          f"面试者不了解该问题，用一句话告诉他这个问题的重要性，并建议面试者学习相关的知识！并根据简历和自我介绍直接提出下一个问题，不需要输出‘下一个问题’字样。主语是‘你’，专业问题不要结合学生工作。")
            else:
                self.professional_question_count += 1
                self.follow_up_count = 0
                prompt = f"请根据简历和自我介绍，提出一个新的专业问题。只需要输出问题，不需要回答好的等。专业问题不要结合学生工作。"
        elif not self.non_professional_question_asked:
            self.non_professional_question_asked = True
            print('student')
            prompt = f"如果简历中有相关学生干部或者社团的经历，提出一个与学生工作或社团相关的问题，不要结合专业问题，输出的主语是’你‘；如果简历中没有写相关学生工作，询问在大学期间有没有参加社团活动或者担任学生干部，其中遇到了什么困难，怎么解决的。"
        else:
            prompt = f"回复结束此环节进入面试拷打环节，输出格式为'此部分提问结束，进入面试拷打环节'。"

        question_msg = AgentMessage(sender='interviewer', content=prompt)
        question = super().__call__(question_msg).content.replace(" ", "").replace("*", "").replace("#", "").replace("\n", "")
        self.questions.append(question)
        return question


    def evaluate_answer(self, question, answer):
        prompt = (f"候选人被问到：'{question}'，其回答是：'{answer}'。请对面试者的回答作出评价，只需回复一个字，回复要求如下："
                  f"如果面试者回答的80%内容正确且较为全面，回复’好‘"
                  f"如果面试者只回答了小部分且有小错误，回复’良‘"
                  f"如果面试者回答基本错误且答非所问，回复’差‘"
                  f"如果面试者指出不会，没有学过等类似的回答，不了解等，回复’不‘"
                  )
        message = [
            {"role": "system", "content": "你是一个计算机行业的面试官，根据问题对面试者的回答进行评价，只回答好、良、差、不"},
            {"role": "user", "content": prompt}
        ]
        payload = {
            "model": "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B",
            "messages": message,
            "stream": False,
            "max_tokens": 512,
            "min_p": 0.05,
            "stop": None,
            "temperature": 0.7,
            "top_p": 0.7,
            "top_k": 50,
            "frequency_penalty": 0.5,
            "n": 1,
            "response_format": {"type": "text"},
        }
        response = requests.request("POST", self.url, json=payload, headers=self.headers)
        full_response = json.loads(response.text)
        content = full_response["choices"][0]["message"]["content"].replace("\n","")
        print(content)
        return content

    def QandA(self):
        qaList = []
        for question,answer in zip(self.questions, self.answers):
            qa = f"对于问题{question},面试者的回答是{answer}"
            qaList.append(qa)
        return qaList
